﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Entidades;
using Negocio;
using Mundialeitor.App_Util;

namespace Mundialeitor
{
    public partial class Etapas : PaginaBase
    {
        //private UsuarioEntity usuario;

        public UsuarioEntity Usuario
        {
            get { return (UsuarioEntity)Session["usuario"]; }
            set { Session["usuario"] = value; }
        }

        public EtapaEntity Etapa
        {
            get { return (EtapaEntity)Session["etapa"]; }
            set { Session["etapa"] = value; }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                Usuario = (UsuarioEntity)Session["usuario"];

                if (Usuario != null && Usuario.TipoUsuario.Id == (int)EnumTipoUsuario.Administrador)
                {
                    if (!IsPostBack)
                    {
                        //ddlEmpateConsulta.DataSource = EnumUtils.GetClaveValor(typeof(EnumSiNoTodos), null);
                        //ddlEmpateConsulta.DataTextField = "Value";
                        //ddlEmpateConsulta.DataValueField = "Key";
                        //ddlEmpateConsulta.DataBind();   
                        Utilidades.CargarComboDesdeEnumeracion(ddlEmpateConsulta, typeof(EnumSiNoTodos));
                    }
                }
                else
                {
                    Server.Transfer(PagesConstants.Login);
                }
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        protected void calFechaInicio_SelectionChanged(object sender, EventArgs e)
        {
            txtFechaInicio.Text = calFechaInicio.SelectedDate.ToString();
        }

        protected void calFechaFin_SelectionChanged(object sender, EventArgs e)
        {
            txtFechaFin.Text = calFechaFin.SelectedDate.ToString();
        }        
        
        protected void btnConsultar_Click(object sender, EventArgs e)
        {
            try
            {
                DateTime? inicioDesde = string.IsNullOrEmpty(txtFechaInicioDesde.Text)?(DateTime?)null:DateTime.Parse(txtFechaInicioDesde.Text);
                DateTime? inicioHasta = string.IsNullOrEmpty(txtFechaInicioHasta.Text)?(DateTime?)null:DateTime.Parse(txtFechaInicioHasta.Text);
                DateTime? finDesde = string.IsNullOrEmpty(txtFechaFinDesde.Text)?(DateTime?)null:DateTime.Parse(txtFechaFinDesde.Text);
                DateTime? finHasta = string.IsNullOrEmpty(txtFechaFinHasta.Text)?(DateTime?)null:DateTime.Parse(txtFechaFinHasta.Text);
                bool? empate = ddlEmpateConsulta.SelectedItem.Text == EnumSiNoTodos.Todos.ToString() ? (bool?)null : ddlEmpateConsulta.SelectedItem.Text == EnumSiNoTodos.Si.ToString() ? true : false;
                
                var regla = new EtapaRules();
                var lista = regla.SeleccionarEtapaPorFiltro(null, txtNombreConsulta.Text.Trim(), inicioDesde, inicioHasta, finDesde, finHasta, empate);

                CargarGrilla(lista);
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        private void CargarGrilla(List<EtapaEntity> lista)
        {
            Session["etapaGrilla"] = lista;
            Utilidades.CargarGrilla(gvEtapas, lista);
        }

        protected void gvEtapas_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            try
            {
                gvEtapas.PageIndex = e.NewPageIndex;
                gvEtapas.DataSource = (List<EtapaEntity>)Session["etapaGrilla"];
                gvEtapas.DataBind();
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        protected void gvEtapas_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                if (!(e.CommandName == "Ver" || e.CommandName == "Configurar" || e.CommandName == "Resultados" || e.CommandName == "Eliminar"))
                {
                    return;
                }

                gvEtapas.SelectedIndex = Convert.ToInt32(e.CommandArgument);
                int id = int.Parse(gvEtapas.SelectedDataKey["Id"].ToString());

                EtapaEntity etapaSeleccionada = ObtenerEtapa(id);

                // Definir el estado del control de usuario
                switch (e.CommandName)
                {
                    case "Ver":
                        CargarDatosEtapa(etapaSeleccionada, true);
                        break;
                    case "Configurar":
                        Response.Redirect("ConformarEtapa.aspx?etapaId=" + etapaSeleccionada.Id.ToString());
                        CargarDatosEtapa(etapaSeleccionada, true);
                        break;
                    case "Resultados":                        
                        RegistrarResultados(etapaSeleccionada);
                        break;
                    case "Eliminar":
                        CargarDatosEtapa(etapaSeleccionada, false);
                        break;
                }

                ModoConsulta(false);
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }        

        private void ModoConsulta(bool valor)
        {
            divConsulta.Visible = valor;
            divABM.Visible = !valor;
        }

        protected void gvGrilla_RowCreated(object sender, GridViewRowEventArgs e)
        {
            try
            {
                // Asociación de CommandArgument de cada fila con el id de la entidad
                if (e.Row.RowType == DataControlRowType.DataRow)
                {
                    ImageButton btn;
                    //Boton Ver
                    btn = (ImageButton)e.Row.FindControl("btnVer");
                    btn.CommandArgument = e.Row.RowIndex.ToString();
                    //Boton Configurar
                    btn = (ImageButton)e.Row.FindControl("btnPartido");
                    btn.CommandArgument = e.Row.RowIndex.ToString();
                    btn.Visible = Usuario.TipoUsuario.Descripcion == "Administrador" ? true : false;
                    //Boton Resultados
                    btn = (ImageButton)e.Row.FindControl("btnResultados");
                    btn.CommandArgument = e.Row.RowIndex.ToString();
                    btn.Visible = Usuario.TipoUsuario.Descripcion == "Administrador" ? true : false;
                    //Boton Eliminar
                    btn = (ImageButton)e.Row.FindControl("btnEliminar");
                    btn.CommandArgument = e.Row.RowIndex.ToString();
                }
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        protected void btnAceptar_Click(object sender, EventArgs e)
        {
            try
            {
                bool alta = Etapa.Id==0;
                Etapa.Nombre = txtNombre.Text.Trim();
                Etapa.PermiteEmpate = chkEmpate.Checked;
                Etapa.Valor = float.Parse(txtValor.Text.Trim());
                Etapa.FechaInicio = DateTime.Parse(txtFechaInicio.Text.Trim());
                Etapa.FechaFin = DateTime.Parse(txtFechaFin.Text.Trim());

                var regla = new EtapaRules();
                regla.GuardarEtapa(Etapa);
                MostrarMensajeDialogo(EnumTipoDeMensaje.Informacion, alta ? "Etapa creada exitosamente" : "Etapa modificada exitosamente");
                ModoConsulta(true);
            }
            catch (Exception)
            {

                throw;
            }
        }

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            try
            {
                LimpiarControles();
                HabilitarControles(true);
                ModoConsulta(true);
            }
            catch (Exception)
            {

                throw;
            }
        }

        private void LimpiarControles()
        {
            txtNombre.Text = "";
            chkEmpate.Checked = false;
            txtValor.Text = "";
            txtFechaInicio.Text = "";
            txtFechaFin.Text = "";
            calFechaInicio.SelectedDate = DateTime.Today;
            calFechaFin.SelectedDate = DateTime.Today;
        }

        private void CargarDatosEtapa(EtapaEntity objEtapa, bool valor)
        {
            txtNombre.Text = objEtapa.Nombre;
            chkEmpate.Checked = objEtapa.PermiteEmpate;
            txtValor.Text = objEtapa.Valor.ToString();
            txtFechaInicio.Text = objEtapa.FechaInicio.ToString();
            txtFechaFin.Text = objEtapa.FechaFin.ToString();

            HabilitarControles(valor);
            Etapa = objEtapa;
        }

        private void RegistrarResultados(EtapaEntity objEtapa)
        {
            if (objEtapa.FechaFin > DateTime.Now)
                throw new ApplicationException("La etapa aun no ha terminado de jugarse");
            var rules = new TablaPosicionesRules();
            var tablas = rules.SeleccionarTablaPosicionesBoletaPorFiltro(null, objEtapa.Id, null);
            if (tablas.Count > 0)
                throw new ApplicationException("Ya se han registrado los resultados de esta etapa");
            rules.RegistrarResultadosDeEtapa(objEtapa);
        }

        private void HabilitarControles(bool valor)
        {
            txtNombre.Enabled = valor;
            chkEmpate.Enabled = valor;
            txtValor.Enabled = valor;
            txtFechaInicio.Enabled = valor;
            txtFechaFin.Enabled = valor;
            calFechaInicio.Enabled = valor;
            calFechaFin.Enabled = valor;
        }

        private EtapaEntity ObtenerEtapa(int id)
        {
            List<EtapaEntity> lista = (List<EtapaEntity>)Session["etapaGrilla"];

            var obj = (from e in lista where e.Id == id select e).FirstOrDefault();

            return obj;
        }

        protected void cvFechaDesde_ServerValidate(object source, ServerValidateEventArgs args)
        {
            DateTime resultado;
            args.IsValid = DateTime.TryParse(txtFechaInicio.Text, out resultado);
        }

        protected void cvFechaHasta_ServerValidate(object source, ServerValidateEventArgs args)
        {
            DateTime resultado;
            args.IsValid = DateTime.TryParse(txtFechaFin.Text, out resultado);
        }

        protected void btnNuevo_Click(object sender, EventArgs e)
        {
            try
            {
                Etapa = new EtapaEntity();
                Etapa.Id = 0;
                ModoConsulta(false);
            }
            catch (Exception)
            {

                throw;
            }
        }

    }
}
